package leetcode.code0166;

import java.util.HashMap;
import java.util.Map;

public class Solution1 extends Solution166 {

	@Override
	public String fractionToDecimal(int numerator, int denominator) {
		if (numerator == 0)
			return "0";
		StringBuffer ans = new StringBuffer();
		// 添加符号
		if ((numerator ^ denominator) < 0) {
			ans.append("-");
		}
		// 转成正数算除法, 类似算数相关的Integer.MIN_VALUE简直恶趣味, int 升级到 long
		long ln = numerator > 0 ? numerator : -(long) numerator;
		long ld = denominator > 0 ? denominator : -(long) denominator;
		long d = ln / ld;
		long m = ln % ld;
		ans.append(d);// 添加整数部分
		if (m != 0) {// 有小数部分
			ans.append(".");// 添加小数点
			Map<Long, Integer> map = new HashMap<>();
			map.put(m, ans.length());// 余数第一次出现时,字符串里面已经有多长
			while (m != 0) {
				m *= 10;// 补0
				d = m / ld;// 不够除自然d=0,添加一个0
				m = m % ld;
				ans.append(d);
				if (map.containsKey(m)) {// 余数再次出现,预示着即将开始循环
					ans.insert(map.get(m), "(");// 在第一次出现的位置插入左括号
					ans.append(")");// 追加右括号,跳出循环
					break;
				} else {
					map.put(m, ans.length());// 余数第一次出现时,字符串里面已经有多长
				}
			}
		}
		return ans.toString();
	}

	public static void main(String[] args) {
		Solution1 so = new Solution1();
		so.debug1();
		so.debug2();
		so.debug3();
		so.debug4();
		so.debug5();
		so.debug6();
//		so.debug(1, 90);
//		so.debug(-1, Integer.MIN_VALUE);
//		so.debug(-50,8);
//		so.debug(7, -12);
		StringBuffer sb = new StringBuffer();
		sb.append("123456");
		sb.insert(3, 9);
		System.out.println(sb.toString());
		System.out.println(sb.substring(1, 2));

	}

}
